#define BLKIF_STATE_DISCONNECTED 0
#define BLKIF_STATE_CONNECTED 1
+#define BLKIF_STATE_SUSPENDED 2
#define MAXIMUM_OUTSTANDING_BLOCK_REQS \
(BLKIF_MAX_SEGMENTS_PER_REQUEST * BLKIF_RING_SIZE)
static void blkif_restart_queue(void *arg);
static void blkif_recover(struct blkfront_info *);
static void blkif_completion(struct blk_shadow *);
-static void blkif_free(struct blkfront_info *);
+static void blkif_free(struct blkfront_info *, int);
/**
DPRINTK("blkfront_resume: %s\n", dev->nodename);
- blkif_free(info);
+ blkif_free(info, 1);
err = talk_to_backend(dev, info);
if (!err)
if (message)
xenbus_dev_fatal(dev, err, "%s", message);
destroy_blkring:
- blkif_free(info);
+ blkif_free(info, 0);
out:
return err;
}
return 0;
fail:
- blkif_free(info);
+ blkif_free(info, 0);
return err;
}
unsigned int binfo;
int err;
- if (info->connected == BLKIF_STATE_CONNECTED)
+ if( (info->connected == BLKIF_STATE_CONNECTED) ||
+ (info->connected == BLKIF_STATE_SUSPENDED) )
return;
DPRINTK("blkfront.c:connect:%s.\n", info->xbdev->otherend);
DPRINTK("blkfront_remove: %s removed\n", dev->nodename);
- blkif_free(info);
+ blkif_free(info, 0);
kfree(info);
req->nr_sectors, req->buffer,
rq_data_dir(req) ? "write" : "read");
+
blkdev_dequeue_request(req);
if (blkif_queue_request(req)) {
blk_requeue_request(rq, req);
return IRQ_HANDLED;
}
-static void blkif_free(struct blkfront_info *info)
+static void blkif_free(struct blkfront_info *info, int suspend)
{
/* Prevent new requests being issued until we fix things up. */
spin_lock_irq(&blkif_io_lock);
- info->connected = BLKIF_STATE_DISCONNECTED;
+ info->connected = suspend ?
+ BLKIF_STATE_SUSPENDED : BLKIF_STATE_DISCONNECTED;
spin_unlock_irq(&blkif_io_lock);
/* Free resources associated with old device channel. */